<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8">
    <title>Sucha's Blog - Archive for February, 2015</title>
    <meta name="generator" content="MarkdownProjectCompositor.lua">
    <meta name="author" content="Sucha">
    <meta name="keywords" content="suchang, programming, Linux, Lua">
    <meta name="description" content="Sucha's blog">
    <link rel="shortcut icon" href="../images/ico.png">
    <link rel="stylesheet" type="text/css" href="../styles/blog.css">
    <link rel="stylesheet" type="text/css" href="../styles/prism.min.css">
    <style id="site_theme"></style>
  </head>
  <body>
    <div id="body">
      <div id="text">
	   <!-- Page published by cmark-gfm begins here --><h1>Sucha's Blog ~ Archive for February, 2015</h1>
<p><a id="p1"></a></p>
<div class="date">15年2月28日 周六 23:44</div>
<h2>IUP &amp; vs2012</h2>
<p>过年在家搭建了 app 的 win 服务端，create install 免费版打包，已经可以使
用了。</p>
<p>架构方面，两个程序组成，都是 win32 api，不需要依赖 dot net。</p>
<p>网上抄的一个 win32 任务栏图标代码，在此基础上加入了之前的跨平台服务端线
程，就跑起来了。</p>
<p>设置界面用的是 IUP 界面库，一个支持 win、gtk、motif 的框架，事件驱动，要
比基础的 win32 gdi 编程好太多，而又不需要依赖 dot net。</p>
<p>之前为了 IPC 通信，还尝试使用了 mail slot，不过当时我的架构不是很好，出
了不少问题，最后也没有继续用下来去，而是直接 findwindow，通过标题栏、
class name 匹配，然后 post message 来通信，感觉也足够了。</p>
<p>学习使用 iup 也花了一些时间，相比之下，为了让 vs2012 支持 xp 而弄的各种
调试，简直让人吐血。</p>
<p>后来我是放弃了 vs2012，改用 vs2010，xp 可是不能放弃的。vs2010 还必须安装
sp1 才行，否则编译下来各种问题，即便是 sp1，也不是每次编译都能顺利通过。</p>
<p>一个 sp1 补丁包就 1.5G，也够吐血的。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2015-02.html#p1">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<!-- date: 2015-02-28T23:44:09+0800 -->
<p><a id="p0"></a></p>
<div class="date">15年2月14日 周六 00:38</div>
<h2>[iOS] dispatch_after</h2>
<p>忙活的网络播放器有了眉目，音视频同步起来了，之前的问题，在于 audio 播放
一直很不顺利，总是偶尔会卡，或者嗤嗤地想，我一直单独地认为是 audio 播放
的问题，或者是 OpenAL 管理 buffer 的问题。</p>
<p>当然后来也发现 OpenAL 的 buffer 管理也是需要注意的，比如建立了 64 个
buffer，做 streaming，最好是都先全部 queue 上去，再 query 哪些已经
processed，之后 buffer data，之后再 re queue；而不是先 queue 一部分，
query 无 processed 之后，queue 新的 buffer，iOS 上面者会造成嗤地噪声，估
计是 OpenAL 管理的问题。</p>
<p>当然 OpenAL 在我这里还有一些未解决的问题，以后再说吧。</p>
<p>接着说不同步的部分，更多的是时钟不同步造成的，也就是延时。</p>
<p>比如主时钟一般都是 video 管着的，而 video 每一帧时间跨度要比 audio 大多
了，一秒才小几十帧，每一帧稍微拖延或快一点，其实我们人眼不敏感，而 audio
呢，普通的 22k 都是差的音频，一般 44.1k，或者 48k，这个时钟相比 video 部
分就要求很精确了，当然这部分其实都是硬件管着，封装出来的 OpenAL 接口也简
单，扔 buffer 进去就行。</p>
<p>问题在于 video 管时钟，video 拖延一点，我们人眼觉得 video 还正常，但是怎
么 audio 就那么刺耳了呢，其实是 audio 的 buffer 数据跟不上了。</p>
<p>在 iOS 平台上面，是 dispatch_after 等这些延时的函数时间非常不精确，虽然
是以 nano seconds 为单位的，但是这个单位只是说能够延时的最小单位，而并不
是精确到这个单位，这两者是有很大区别的。</p>
<p>所以 AV 同步部分就得做很多的时间检测以及补偿，如果是 video 主时钟，就补
偿 video，并不是为了人眼看得舒服（其实真看不出来），而是为了 audio 能够
顺利同步，两边的 buffer 都能够平衡。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2015-02.html#p0">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<!-- date: 2015-02-14T00:38:00+0800 -->
<!-- Page published by cmark-gfm ends here -->
  <div id="foot">2004-<script>var d = new
	Date();document.write(d.getFullYear())</script> &copy;
	Sucha. Powered by MarkdownProjectCompositor.
  </div>
  </div><!-- text -->
  <div id="sidebar">
  </div><!-- sidebar -->
  <script src="../js/prism.min.js" async="async"></script>
  <script src="../js/blog_sidebar.js"></script>
  </div> <!-- body -->
</body>
</html>